package com.example.demo.controller;

import com.example.demo.common.PassToken;
import com.example.demo.util.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author shiwen
 * @date 2020/7/15
 */
@RestController
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 通过request获取请求头
     */
    @Autowired
    private HttpServletRequest request;

    @GetMapping("/login")
    public Map login(String id, String subject, String roles){
        String token = jwtUtil.createJWT(id, subject, roles);
        Map<String, Object> map = new HashMap<>();
        // 登录直接返回签名
        map.put("token", token);
        // 这里相当于：token里面有一个roles、map里面也有一个roles，这就有两个roles了；
        // 但是没必要生成token的时候也这样做，这样做的好处就是当我们登录成功的时候可以做一个权限校验
        // map.put("roles", roles);
        return map;
    }

    @GetMapping("/isAdmin")
    public String isAdmin(){
        String header = request.getHeader("Authorization");
        // 判断是否为空
        if (header == null || "".equals(header)) {
            // throw new RuntimeException("no quan xian");
            return "no quan xian";
        }
        if (!header.startsWith("Bearer ")) {
            return "no quan xian";
        }
        // 得到token令牌
        String token = header.substring(7);
        try {
            // 解析令牌
            Claims claims = jwtUtil.parseJWT(token);
            String roles = (String) claims.get("roles");
            // 判断roles是否为空或者roles角色是否为admin
            if (!"admin".equals(roles) || roles == null) {
                return "no quan xian";
            }
        } catch (Exception e) {
            return "no quan xian";
        }
        return "is admin";
    }

    @GetMapping("/isAdminBetter")
    @PassToken
    public String isAdminBetter(){
        String header = request.getHeader("token");
        // 判断是否为空,如果请求token为空的话直接no quan xian
        if (header == null || "".equals(header)) {
            return "no quan xian";
        }
        // 得到token令牌，这里获取的是value的值，而不是key的值，比如：token:adewbvcbcs.adazccz.rnbgfdch的话，就是获取value的值
        String token = header;
        try {
            // 解析令牌
            Claims claims = jwtUtil.parseJWT(token);
            // 获取存储在claims中的角色roles
            String roles = (String) claims.get("roles");
            // 判断roles是否为空或者roles角色是否为admin
            if (!"admin".equals(roles) || roles == null) {
                return "no quan xian";
            }
        } catch (Exception e) {
            return "no quan xian";
        }
        return "is admin";
    }

    @GetMapping("/test")
    public String getStr() {
        String claims = (String) request.getAttribute("claims");
        return claims == null && "".equals(claims) ? "not admin" : "is admin";
    }

}